// Στο Node.js τα global αντικείμενα, για να έχουν εμβέλεια και σε άλλα αρχεία
// κώδικα που συμπεριλαμβάνονται με "require", πρέπει να ενταχθούν στο μόνο εξ
// ορισμού τέτοιο (global) αντικείμενο που παρέχεται και το οποίο ονομάζεται,
// πώς αλλιώς, "global". Αυτό είναι καλό και βοηθάει στην εξατομίκευση των επί
// μέρους global αντικειμένων που μπορούν ορίζονται με "var" μέσα στα διάφορα
// modules. Το πρόθεμα "global" μπορεί να παραλείπεται στον server, όπως ακριβώς
// μπορεί να παραλείπεται στον client το πρόθεμα "window".

// Τα global αντικείμενα "Client"  και "Server" δείχνουν αν εκτελείται javascript
// κώδικας στον client ή στον server, ανάλογα με το ποιο από τα δύο αντικείμενα
// είναι ορισμένο, ενώ το άλλο τίθεται false. Εδώ βρισκόμαστε στον server, επομένως
// το "Client" τίθεται false. Στο αντικείμενο "Server" θα εντάξουμε αργότερα και
// κάποια properties και μεθόδους.

Client = false;
Server = {};

// Από εδώ και κάτω τα αντικείμενα "Client" και "Server" είναι γνωστά στο παρόν
// και σε όλα τα υπόλοιπα modules και θα αναφέρονται χωρίς το πρόθεμα "global".
// Το ίδιο ισχύει και για όλα τα υπόλοιπα global αντικείμενα. Υπάρχουν, επίσης,
// και global αντικείμενα που θέλουμε να είναι κοινά στον server και στον client.
// Αυτά τα αντικείμενα ορίζονται στο παρόν, ή σε άλλα server modules, εκτός
// οποιασδήποτε function και χωρίς το πρόθεμα var στα κοινά modules. Αυτό έχει ως
// αποτέλεσμα στον μεν server να αναφέρονται στα εδώ ορισμένα global αντικείμενα,
// στον δε client να οριστούν global χωρίς τη χρήση του προθέματος "var".

// Εμπλουτίζουμε με δομές και μεθόδους που αφορούν στο console log. Δεν είναι κάτι
// βασικό, αλλά είναι προαπαιτούμενο. Για ευνόητους λόγους η ενημέρωση είναι πρωθύστερη.

require('./log.js');
Log.print('reading "log" module');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι κοινές σε server και client, και
// αφορούν σε γενικές JavaScript functions.

Log.print('reading common "globals" module');
require('../client/common/globals.js');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι απαραίτητες για την επαφή μας με την
// database.

Log.print('reading database access module');
require('./db.js');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι κοινές σε server και client, και
// αφορούν στον «Πρεφαδόρο».

Log.print('reading common "prefadoros" module');
require('../client/common/prefadoros.js');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι κοινές σε server και client και
// αφορούν στη διαμόρφωση και στον χειρισμό του σκηνικού.

Log.print('reading common "skiniko" module');
require('../client/common/skiniko.js');

// Εμπλουτίζουμε με δομές και μεθόδους που αφορούν στη διαμόρφωση και στο χειρισμό
// του σκηνικού ειδικά από την πλευρά του server.

Log.print('reading server "skiniko" module');
require('./skiniko.js');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι κοινές σε server και client και
// αφορούν στο στήσιμο της παρτίδας.

Log.print('reading common "stisimo" module');
require('../client/common/stisimo.js');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι κοινές σε server και client και
// αφορούν στα παιγνιόχαρτα, στις χαρτωσιές, στην τράπουλα κλπ.

Log.print('reading common "trapoula" module');
require('../client/common/trapoula.js');

// Εμπλουτίζουμε με δομές και μεθόδους που  αφορούν στα παιγνιόχαρτα, στις χαρτωσιές,
// στην τράπουλα κλπ, και είναι ιδιαίτερες για το server και μόνο.

Log.print('reading server "trapoula" module');
require('../server/trapoula.js');

// Εμπλουτίζουμε με δομές και μεθόδους που είναι κοινές σε server και client και
// αφορούν στο παιχνίδι, δηλαδή δηλώσεις, αγορές, μπάζες, αξίες κλπ.

Log.print('reading common "pexnidi" module');
require('../client/common/pexnidi.js');

// Εμπλουτίζουμε με δομές και μεθόδους που αφορούν στον τρόπο με τον οποίο εκκινούν οι
// υπηρεσίες που παρέχει ο παρών server.

Log.print('reading server module');
require('./server.js');

// Εμπλουτίζουμε με δομές και μεθόδους που αφορούν στον κύκλο τακτικού ελέγχου εργασιών.

Log.print('reading "peripolos" module');
require('./peripolos.js');

// Εμπλουτίζουμε με δομές και μεθόδους που αφορούν στον εξωτερικό έλεγχο των εσωτερικών
// δομών του παρόντος server.

Log.print('reading "monitor" module');
require('./monitor.js');

// Αναπροσαρμόζουμε διάφορες παραμέτρους, στήνουμε το σκηνικό και μπαίνουμε σε κατάσταση
// ετοιμότητας. Όλα αυτά θα γίνουν αλυσιδωτά, εκκινώντας με την "Server.ekinisi"
// και συνεχίζοντας με callbacks, λόγω της ασύγχρονης φύσης του Node.

Server.ekinisi();
